﻿using FakeXiecheng.API.Dtos;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.Data;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace FakeXiecheng.API.Controllers
{

    [ApiController]
    [Route("api/[controller]")]
    public class AuthenticateController : ControllerBase
    {
        private readonly IConfiguration _configuration;
        private UserManager<IdentityUser> _userManager;
        public AuthenticateController(IConfiguration configuration,UserManager<IdentityUser> userManager)
        {
            _configuration = configuration;
            _userManager = userManager;
        }
        [AllowAnonymous]  // 允许匿名访问，不需要身份验证即可调用此接口
        [HttpPost("{login}")]  // 定义HTTP POST路由，{login}是路由参数，但这里可能应该是固定路径
        public IActionResult Login([FromBody] LoginDTO login)  // 从请求体接收登录数据
        {
            // TODO: 验证用户登录逻辑
            // 这里应该验证用户名密码是否正确，查询数据库等

            // ============ 创建JWT令牌的三个部分 ============

            // 1. Header部分：定义签名算法
            var signingAlgorithm = SecurityAlgorithms.HmacSha256;  // 使用HMAC SHA256算法进行签名

            // 2. Payload部分：定义令牌中携带的数据（声明）
            var claims = new[]
            {
             // 创建声明，JwtRegisteredClaimNames.Sub表示主题（通常是用户ID）
             // 这里写死了"fake_user_id"，实际应该用真实的用户ID
             new Claim(JwtRegisteredClaimNames.Sub, "fake_user_id"),
             // 还可以添加其他声明，如：
             // new Claim(JwtRegisteredClaimNames.Name, user.Username),
              new Claim(ClaimTypes.Role, "Admin")
            };

            // 3. Signature部分：创建签名密钥和凭证
            // 从配置文件中获取密钥字符串并转换为字节数组
            var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecritKey"]);
            // 使用密钥创建对称安全密钥对象
            var signingKey = new SymmetricSecurityKey(secretByte);
            // 创建签名凭证，将算法和密钥组合
            var signingCredentials = new SigningCredentials(signingKey, signingAlgorithm);

            // ============ 组装完整的JWT令牌 ============

            // 创建JWT安全令牌对象，包含所有必要信息
            var token = new JwtSecurityToken(
                issuer: _configuration["Authentication:Issuer"],  // 令牌发行者（通常是网站域名）
                audience: _configuration["Authentication:Issuer"], // 令牌受众（接收此令牌的一方）
                claims,  // 上面定义的声明数组
                notBefore: DateTime.UtcNow,  // 令牌生效时间（立即生效）
                expires: DateTime.UtcNow.AddDays(1),  // 令牌过期时间（1天后）
                signingCredentials  // 签名凭证
            );

            // 将JWT安全令牌对象序列化为字符串格式
            var tokenStr = new JwtSecurityTokenHandler().WriteToken(token);

            // 返回200状态码和JWT令牌字符串
            return Ok(tokenStr);
        }

        [AllowAnonymous]
        [HttpPost]
        public async Task<IActionResult> RegisterLogin([FromBody] RegisterDTO register)
        {
            // 使用用户名创建用户对象
            var user = new IdentityUser
            {
                UserName = register.Email,
                Email = register.Email
            };

            //对用户密码进行加密
            var result = await _userManager.CreateAsync(user, register.Password);
            if (!result.Succeeded)
            {
                // 创建失败，返回错误信息
                return BadRequest(result.Errors);
            }
            // 返回200状态码

            return Ok();
        }

    }
}
